% check_all_cases_data.m
% 检查所有案例的数据完整性

clear; clc;

% 定义所有案例
case_names = {
    'Conv_Case0',
    'Conv_Case1', 
    'FlashAttention_Case0',
    'FlashAttention_Case1',
    'Matmul_Case0',
    'Matmul_Case1'
};

% 必需的输入文件
required_input_files = {
    '_Nodes.csv',
    '_Edges.csv',
    '_final_schedule_optimized.txt'
};

% 预期的输出文件
expected_output_files = {
    '_pareto_solutions.csv',
    '_convergence_history.csv',
    '_memory_usage_stats.csv',
    '_memory_allocation_history.csv',
    '_buffer_lifetimes.csv'
};

fprintf('=== 多案例数据完整性检查 ===\n');
fprintf('检查案例数量: %d\n', length(case_names));
fprintf('================================\n');

data_dir = 'data';
results_dir = fullfile('build', 'output', 'visualizations');

% 统计变量
total_ready = 0;
total_missing_input = 0;
total_missing_output = 0;

for i = 1:length(case_names)
    case_name = case_names{i};
    
    fprintf('\n[%d/%d] 检查案例: %s\n', i, length(case_names), case_name);
    fprintf('----------------------------------\n');
    
    % 检查输入文件
    input_complete = true;
    fprintf('输入文件检查:\n');
    for j = 1:length(required_input_files)
        filename = [case_name required_input_files{j}];
        filepath = fullfile(data_dir, filename);
        
        if exist(filepath, 'file')
            file_info = dir(filepath);
            fprintf('  ✓ %s (%.1f KB)\n', filename, file_info.bytes/1024);
        else
            fprintf('  ✗ %s (缺失)\n', filename);
            input_complete = false;
        end
    end
    
    % 检查输出文件
    output_complete = true;
    output_count = 0;
    fprintf('输出文件检查:\n');
    case_output_dir = fullfile(results_dir, case_name);
    
    if exist(case_output_dir, 'dir')
        for j = 1:length(expected_output_files)
            filename = [case_name expected_output_files{j}];
            filepath = fullfile(case_output_dir, filename);
            
            if exist(filepath, 'file')
                file_info = dir(filepath);
                data_table = readtable(filepath);
                fprintf('  ✓ %s (%d行, %.1f KB)\n', filename, height(data_table), file_info.bytes/1024);
                output_count = output_count + 1;
            else
                fprintf('  ✗ %s (缺失)\n', filename);
                output_complete = false;
            end
        end
    else
        fprintf('  ✗ 输出目录不存在: %s\n', case_output_dir);
        output_complete = false;
    end
    
    % 状态总结
    if input_complete && output_complete
        fprintf('状态: ✅ 完全就绪 (%d/%d输出文件)\n', output_count, length(expected_output_files));
        total_ready = total_ready + 1;
    elseif input_complete && ~output_complete
        fprintf('状态: 🔄 输入就绪，需要运行 (%d/%d输出文件)\n', output_count, length(expected_output_files));
        total_missing_output = total_missing_output + 1;
    else
        fprintf('状态: ❌ 输入文件缺失，无法运行\n');
        total_missing_input = total_missing_input + 1;
    end
end

% 总体报告
fprintf('\n================================\n');
fprintf('=== 数据完整性检查报告 ===\n');
fprintf('================================\n');
fprintf('✅ 完全就绪 (可直接可视化): %d 案例\n', total_ready);
fprintf('🔄 需要运行优化: %d 案例\n', total_missing_output);
fprintf('❌ 输入文件缺失: %d 案例\n', total_missing_input);
fprintf('📊 总计: %d 案例\n', length(case_names));
fprintf('================================\n');

% 给出建议
if total_missing_input > 0
    fprintf('\n⚠️  发现缺失输入文件，请检查data/目录中的文件\n');
end

if total_missing_output > 0
    fprintf('\n💡 建议操作:\n');
    fprintf('   1. 使用多案例版本运行所有案例:\n');
    fprintf('      - 备份当前 main.cpp: cp src/main.cpp src/main_backup.cpp\n');
    fprintf('      - 使用多案例版本: cp src/main_multi_cases.cpp src/main.cpp\n');
    fprintf('      - 重新编译运行: cmake --build build --config Release && build/Release/matlab_to_cpp.exe\n');
    fprintf('   2. 然后运行批量可视化: visualize_all_cases\n');
end

if total_ready == length(case_names)
    fprintf('\n🎉 所有案例数据完整！可直接运行: visualize_all_cases\n');
end

fprintf('\n数据完整性检查完成！\n');



